package org.apache.ibatis.config.mapping;

import org.apache.ibatis.sql.session.Configuration;

import java.util.Collections;
import java.util.List;

/**
 * @Name ParameterMap
 * @Description: [参数化映射 Map] 类
 * 描述信息：ParameterMap 和 ResultMap 类似。
 * ParameterMap 通常应用于 Mapper 中传入多个参数时，表示将查询结果集中列值的类型按照入参列表一一映射到 JAVA 对象的属性类型上。
 * 例如，
 * <parameterMap id="insertUserParam" class="User">
 * <parameter property="username" />
 * <parameter property="password" />
 * </parameterMap>
 * 补充：在开发过程中不推荐使用这种方式，一般使用 ParameterType 直接将查询结果列值类型自动对应到 JAVA 对象的属性类型上，而不是配置映射关系一一对应。
 * @Version v1.0.0
 * @Author: lichao
 * @Date: 2024-05-19 16:20:56
 **/
public class ParameterMap {
    private String id;
    private Class<?> type;
    private List<ParameterMapping> parameterMappings;

    private ParameterMap() {
    }

    public static class Builder {
        private ParameterMap parameterMap = new ParameterMap();

        public Builder(Configuration config, String id, Class<?> type, List<ParameterMapping> parameterMappings) {
            parameterMap.id = id;
            parameterMap.type = type;
            parameterMap.parameterMappings = parameterMappings;
        }

        public ParameterMap build() {
            // 锁定集合
            parameterMap.parameterMappings = Collections.unmodifiableList(parameterMap.parameterMappings);
            return parameterMap;
        }

    }

    public String getId() {
        return id;
    }

    public Class<?> getType() {
        return type;
    }

    public List<ParameterMapping> getParameterMappings() {
        return parameterMappings;
    }
}

